/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 苏李涛
 * Date: 2024-08-26
 * Time: 16:42
 */

/**
 * 无重复字符的最长子串:
 *
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长
 * 子串的长度。
 * 示例 1:
 *
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 示例 2:
 *
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 示例 3:
 *
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 */
public class UniqueString {
    public int lengthOfLongestSubstring(String ss) {
        //将字符串数组转化为字符数组
        char[] s = ss.toCharArray();
        /**用数组模拟哈希表：
         哈希表里面存的是某个ask码值字符出现的次数
         */
        int[] hash = new int[128];
        int left = 0;
        int right = 0;
        int n = ss.length();
        int ret = 0;
        while(right < n){
            //进窗口
            hash[s[right]]++;

            //判断
            while(hash[s[right]] > 1){
                //出窗口，hash数组就里没有重复字符
                hash[s[left++]]--;
            }
            //更新结果
            ret = Math.max(ret,right-left+1);
            right++;//让下一个字符进入窗口

        }
        return ret;
    }
}
